<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=696253
-->
<head>
  <meta charset="utf-8">
  <title>Test for flex-grow and flex-shrink animation (Bug 696253)</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="application/javascript" src="animation_utils.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
  <style type="text/css">

  /* Set flex-grow and flex-shrink to nonzero values,
     when no animations are applied. */

  * { flex-grow: 10; flex-shrink: 20 }

  /* Animations that we'll test (individually) in the script below: */
  @keyframes flexGrowTwoToThree {
     0%   { flex-grow: 2 }
     100% { flex-grow: 3 }
  }
  @keyframes flexShrinkTwoToThree {
     0%   { flex-shrink: 2 }
     100% { flex-shrink: 3 }
  }
  @keyframes flexGrowZeroToZero {
     0%   { flex-grow: 0 }
     100% { flex-grow: 0 }
  }
  @keyframes flexShrinkZeroToZero {
     0%   { flex-shrink: 0 }
     100% { flex-shrink: 0 }
  }
  @keyframes flexGrowZeroToOne {
     0%   { flex-grow: 0 }
     100% { flex-grow: 1 }
  }
  @keyframes flexShrinkZeroToOne {
     0%   { flex-shrink: 0 }
     100% { flex-shrink: 1 }
  }
  @keyframes flexGrowOneToZero {
     0%   { flex-grow: 1 }
     100% { flex-grow: 0 }
  }
  @keyframes flexShrinkOneToZero {
     0%   { flex-shrink: 1 }
     100% { flex-shrink: 0 }
  }

  </style>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=696253">Mozilla Bug 696253</a>
<div id="display">
  <div id="myDiv"></div>
</div>
<pre id="test">
<script type="application/javascript">
"use strict";

/** Test for flex-grow and flex-shrink animation (Bug 696253) **/

// take over the refresh driver
advance_clock(0);

// ANIMATIONS THAT SHOULD AFFECT COMPUTED STYLE
// --------------------------------------------

// flexGrowTwoToThree: 2.0 at 0%, 2.5 at 50%, 10 after animation is over
var [ div, cs ] = new_div("animation: flexGrowTwoToThree linear 1s");
is_approx(+cs.flexGrow, 2, 0.01, "flexGrowTwoToThree at 0.0s");
advance_clock(500);
is_approx(+cs.flexGrow, 2.5, 0.01, "flexGrowTwoToThree at 0.5s");
advance_clock(1000);
is(cs.flexGrow, "10", "flexGrowTwoToThree at 1.5s");
done_div();

// flexShrinkTwoToThree: 2.0 at 0%, 2.5 at 50%, 20 after animation is over
[ div, cs ] = new_div("animation: flexShrinkTwoToThree linear 1s");
is_approx(cs.flexShrink, 2, 0.01,  "flexShrinkTwoToThree at 0.0s");
advance_clock(500);
is_approx(cs.flexShrink, 2.5, 0.01, "flexShrinkTwoToThree at 0.5s");
advance_clock(1000);
is(cs.flexShrink, "20", "flexShrinkTwoToThree at 1.5s");
done_div();

// flexGrowZeroToZero: 0 at 0%, 0 at 50%, 10 after animation is over
[ div, cs ] = new_div("animation: flexGrowZeroToZero linear 1s");
is(cs.flexGrow, "0", "flexGrowZeroToZero at 0.0s");
advance_clock(500);
is(cs.flexGrow, "0", "flexGrowZeroToZero at 0.5s");
advance_clock(1000);
is(cs.flexGrow, "10", "flexGrowZeroToZero at 1.5s");
done_div();

// flexShrinkZeroToZero: 0 at 0%, 0 at 50%, 20 after animation is over
[ div, cs ] = new_div("animation: flexShrinkZeroToZero linear 1s");
is(cs.flexShrink, "0", "flexShrinkZeroToZero at 0.0s");
advance_clock(500);
is(cs.flexShrink, "0", "flexShrinkZeroToZero at 0.5s");
advance_clock(1000);
is(cs.flexShrink, "20", "flexShrinkZeroToZero at 1.5s");
done_div();

// ANIMATIONS THAT DIDN'T USED TO AFFECT COMPUTED STYLE, BUT NOW DO
// ----------------------------------------------------------------
// (In an older version of the flexbox spec, flex-grow & flex-shrink were not
// allowed to animate between 0 and other values. But now that's allowed.)

// flexGrowZeroToOne: 0 at 0%, 0.5 at 50%, 10 after animation is over.
[ div, cs ] = new_div("animation: flexGrowZeroToOne linear 1s");
is(cs.flexGrow, "0", "flexGrowZeroToOne at 0.0s");
advance_clock(500);
is(cs.flexGrow, "0.5", "flexGrowZeroToOne at 0.5s");
advance_clock(1000);
is(cs.flexGrow, "10", "flexGrowZeroToOne at 1.5s");
done_div();

// flexShrinkZeroToOne: 0 at 0%, 0.5 at 50%, 20 after animation is over.
[ div, cs ] = new_div("animation: flexShrinkZeroToOne linear 1s");
is(cs.flexShrink, "0",  "flexShrinkZeroToOne at 0.0s");
advance_clock(500);
is(cs.flexShrink, "0.5", "flexShrinkZeroToOne at 0.5s");
advance_clock(1000);
is(cs.flexShrink, "20", "flexShrinkZeroToOne at 1.5s");
done_div();

// flexGrowOneToZero: 1 at 0%, 0.5 at 50%, 10 after animation is over.
[ div, cs ] = new_div("animation: flexGrowOneToZero linear 1s");
is(cs.flexGrow, "1", "flexGrowOneToZero at 0.0s");
advance_clock(500);
is(cs.flexGrow, "0.5", "flexGrowOneToZero at 0.5s");
advance_clock(1000);
is(cs.flexGrow, "10", "flexGrowOneToZero at 1.5s");
done_div();

// flexShrinkOneToZero: 1 at 0%, 0.5 at 50%, 20 after animation is over.
[ div, cs ] = new_div("animation: flexShrinkOneToZero linear 1s");
is(cs.flexShrink, "1",  "flexShrinkOneToZero at 0.0s");
advance_clock(500);
is(cs.flexShrink, "0.5", "flexShrinkOneToZero at 0.5s");
advance_clock(1000);
is(cs.flexShrink, "20", "flexShrinkOneToZero at 1.5s");
done_div();

SpecialPowers.DOMWindowUtils.restoreNormalRefresh();

</script>
</pre>
</body>
</html>
